package com.uva.dbcs.gestionDeReservaAlquiler.persistencia.impl;

import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.uva.dbcs.gestionDeReservaAlquiler.dominio.Alquiler;
import com.uva.dbcs.gestionDeReservaAlquiler.dominio.Reserva;
import com.uva.dbcs.gestionDeReservaAlquiler.persistencia.ReservaDAO;
import com.uva.dbcs.utilidades.persistencia.GenericAbstractDAO;

/**
 * Session Bean implementation class ReservaDAOImpl
 */
@Stateless
public class ReservaDAOImpl extends GenericAbstractDAO<Reserva, Integer> implements ReservaDAO {

	@PersistenceContext
	EntityManager entityManager;
	
	public ReservaDAOImpl() {
		super(Reserva.class);
		
	}

	@Override
	public EntityManager getEntityManager() {
		
		return entityManager;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Reserva> findReservas(List<Integer> listaIdsVehiculos,
			Date fechaInicio, Date fechaFin) {
		
		// tenemos que construir la quuery dinamicamente en jpql
		StringBuilder sb = new StringBuilder();
		boolean estaListaIdsVehiculos = false;
		boolean estafechaInicio = false;
		boolean estafechaFin = false;

		sb.append("select r FROM Reserva r where 1=1 ");

		if ((listaIdsVehiculos != null) && (listaIdsVehiculos.size()>0)) {
			sb.append(" and r.idVehiculo in :listaIdsVehiculos  ");
			estaListaIdsVehiculos = true;
		}

		if (fechaInicio != null && fechaFin == null) {
			sb.append(" and r.fechaFinAlquiler < :fechaInicio ");
			estafechaInicio = true;

		} else if (fechaFin != null && fechaInicio == null) {

			sb.append("  and r.fechaInicioAlquiler >= :fechaFin ");
			estafechaFin = true;

		} else if (fechaInicio == null && fechaFin == null) {
			// no añadimos nada

		} else if (fechaInicio != null && fechaFin != null) {
			sb.append(" and ((r.fechaFinAlquiler > :fechaInicio and r.fechaFinAlquiler <:fechaFin )")
					.append(" or (r.fechaInicioAlquiler > :fechaInicio and r.fechaFinAlquiler < :fechaInicio)")
					.append(" or (r.fechaInicioAlquiler < :fechaInicio and r.fechaFinAlquiler> :fechaFin))");
			estafechaInicio = true;
			estafechaFin = true;

		}

		Query query = getEntityManager().createQuery(sb.toString(), Alquiler.class);
		
		if (estaListaIdsVehiculos){
			query.setParameter("listaIdsVehiculos", listaIdsVehiculos);
		}
		if (estafechaInicio){
			query.setParameter("fechaInicio", fechaInicio);
		}
		if (estafechaFin){
			query.setParameter("fechaFin", fechaFin);
		}

		
		return query.getResultList();
		
	}

}
